fn main() {
    my_mod::fun();
    my_mod::indirect_fun();
    my_mod::nested::fun1();
    // 不能访问private函数
    // my_mod::nested::private_fun();
    // 不能访问pub（self）的函数
    // my_mod::nested::self_fun();
    // my_mod::nested::super_fun();
}
mod my_mod {

    #[warn(dead_code)]
    fn private_fun() {
        println!("private fun")
    }
    pub fn fun() {
        println!("pub fun")
    }
    // 公共的函数可以在当作用域访问私有函数
    pub fn indirect_fun() {
        private_fun()
    }
    #[warn(unused, dead_code)]
    fn access_nested_in_path_fun() {
        nested::in_path_fun();
        nested::super_fun();
        // nested::self_fun();
    }

    // 模块还能嵌套
    #[allow(dead_code)]
    pub mod nested {
        pub fn fun1() {
            println!("call my_mod::nested::fun1");
            private_fun();
        }

        fn private_fun() {
            println!("private fun")
        }
        // 只能在当前模块my_mod下访问
        pub(in crate::my_mod) fn in_path_fun() {}

        // 只能在当前模块下访问（nested下）

        pub(self) fn self_fun() {
            println!("self_fun")
        }
        // 可以在上级模块my_mod下访问
        pub(super) fn super_fun() {
            println!("super_fun")
        }
    }
    pub fn test3() {
        nested::super_fun();
        // 访问不到pub（self）哦
        //nested::self_fun();
    }
}
mod other_mod {
    use crate::my_mod;
    #[allow(dead_code)]
    fn fun() {
        my_mod::nested::fun1();
        //in_path_fun（）设置了只能在my_mod模块下可以访问
        // my_mod::nested::in_path_fun();
        // 外部模块，访问不到pub(self)的函数
        // my_mod::nested::self_fun()
        my_mod::test3();
    }
}
